package br.com.vfcfw.commons.util;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;

import org.apache.log4j.Logger;

/**
 * Classe utilitária para obter mensagens do arquivo de recursos.
 * 
 * @author Vitor Franco do Carmo (vitor.carmo@capgemini.com)
 * @since 18/05/2012
 * 
 */
public final class MensagemUtil {

    private static final Logger LOGGER = Logger.getLogger(MensagemUtil.class);

    /**
     * Retorna o texto, no arquivo de recurso pt_BR, correspondente a chave passada.
     * 
     * @param chave Chave do texto no arquivo de recurso.
     * @param argumentos Argumentos que substituirão os curingas no texto.
     * @return Texto.
     */
    public static String obterMensagem(String chave, Object... argumentos) {

        return obterMensagem(new Locale("pt", "BR"), chave, argumentos);
    }

    /**
     * Retorna o texto, no arquivo de recurso, correspondente a chave passada em uma determinada localidade.
     * 
     * @param locale {@link Locale} (<tt>Localidade</tt>).
     * @param chave Chave do texto no arquivo de recurso.
     * @param argumentos Argumentos que substituirão os curingas no texto.
     * @return Texto.
     */
    public static String obterMensagem(Locale locale, String chave, Object... argumentos) {

        return obterMensagem(obterResourceBundle("messageText", locale), chave, argumentos);
    }

    /**
     * Retorna o texto, no arquivo de recurso, correspondente a chave passada.
     * 
     * @param resource {@link ResourceBundle} (<tt>Arquivo de recurso</tt>).
     * @param chave Chave do texto no arquivo de recurso.
     * @param argumentos Argumentos que substituirão os curingas no texto.
     * @return Texto.
     */
    public static String obterMensagem(ResourceBundle resource, String chave, Object... argumentos) {

        String mensagem = null;

        LogUtil.debug(LOGGER, String.format("Obtendo mensagem com a chave: %s.", chave));

        try {

            mensagem = resource.getString(chave);

            if (argumentos.length > 0) {
                mensagem = MessageFormat.format(mensagem, argumentos);
            }
        } catch (Exception e) {
            LogUtil.error(LOGGER, e, "Erro ao obter mensagem com a chave: %s. Retornando a chave.", chave);
            mensagem = chave;
        }
        return mensagem;
    }

    /**
     * Retorna o {@link ResourceBundle} (<tt>Arquivo de recurso</tt>) para uma determinada localidade.
     * 
     * @param nomeArquivoRecurso Nome do arquivo de recurso.
     * @param locale {@link Locale} (<tt>Localidade</tt>).
     * @return {@link ResourceBundle}.
     */
    public static ResourceBundle obterResourceBundle(String nomeArquivoRecurso, Locale locale) {

        ResourceBundle resourceBundle = null;

        LogUtil.debug(LOGGER, String.format("Obtendo o arquivo de mensagens com o nome: %s.", nomeArquivoRecurso));

        try {

            resourceBundle = ResourceBundle.getBundle(nomeArquivoRecurso, locale);

        } catch (Exception e) {
            LogUtil.error(LOGGER, e, "Erro ao obter o arquivo de mensagens com o nome: %s.", nomeArquivoRecurso);
        }
        return resourceBundle;
    }

    /**
     * Retorna o {@link ResourceBundle} (<tt>Arquivo de recurso</tt>).
     * 
     * @param resourceName Nome do arquivo de recurso.
     * @return {@link ResourceBundle}.
     */
    public static ResourceBundle obterResourceBundle(String resourceName) {

        ResourceBundle resourceBundle = null;

        LogUtil.debug(LOGGER, String.format("Obtendo o arquivo de mensagens com o nome: %s.", resourceName));

        try {

            resourceBundle = ResourceBundle.getBundle(resourceName);

        } catch (Exception e) {
            LogUtil.error(LOGGER, e, "Erro ao obter o arquivo de mensagens com o nome: %s.", resourceName);
        }
        return resourceBundle;
    }

}
